Conversation
WalkthroughAdds scheduled-download support across the engine and UI, replaces the old move-up/down ordering flow with drag-and-drop reordering, updates the release workflow to publish updater signatures and latest.json, and changes several app and documentation links to risuko.app. ChangesScheduled downloads and drag reorder
Release updater signing pipeline
Branding URL updates
Estimated code review effort: 4 (Complex) | ~75 minutes Sequence Diagram(s)sequenceDiagram
participant ScheduleDialog
participant taskStore
participant engine_cmds
participant TaskManager
ScheduleDialog->>taskStore: setSchedule(gid, startAt)
taskStore->>engine_cmds: set_task_schedule(gid, startAt)
engine_cmds->>TaskManager: set_task_schedule()
TaskManager->>TaskManager: check_scheduled_tasks()
TaskManager->>TaskManager: reconcile_active_set()
TaskManager-->>taskStore: refetch task list
sequenceDiagram
participant release job
participant updater fragments
participant updater-manifest job
participant build-updater-manifest.mjs
participant GitHub Release
release job->>updater fragments: upload fragments/<key>.json
release job->>GitHub Release: upload asset + .sig + .sha256
updater-manifest job->>updater fragments: download updater-fragment-*
updater-manifest job->>build-updater-manifest.mjs: generate latest.json
build-updater-manifest.mjs-->>updater-manifest job: latest.json
updater-manifest job->>GitHub Release: upload latest.json
Possibly related PRs
Suggested labels: Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
12 issues found across 42 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="src/renderer/components/TaskDetail/TaskGeneral.vue">
<violation number="1" location="src/renderer/components/TaskDetail/TaskGeneral.vue:257">
P2: Task detail now re-renders every second even for non-scheduled tasks because the timer is started unconditionally in `mounted`. Gating interval startup to valid future scheduled tasks avoids unnecessary UI churn and background work.</violation>
</file>
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
There was a problem hiding this comment.
Actionable comments posted: 18
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
scripts/build-updater-manifest.test.mjs (1)
1-45: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winExtend test coverage to the other guard clauses.
Only the missing-
versionerror is asserted.buildManifestalso throws for missingrepo, incomplete fragments (missingkey/asset/signature), and an empty fragments directory — none of these are covered here.✅ Suggested additional assertions
assert.throws(() => buildManifest(dir, { repo: "x/y" }), /version required/); +assert.throws(() => buildManifest(dir, { version: "1.0.0" }), /repo .* required/); + +const emptyDir = mkdtempSync(join(tmpdir(), "frag-empty-")); +assert.throws( + () => buildManifest(emptyDir, { version: "1.0.0", repo: "x/y" }), + /no fragments/, +); +rmSync(emptyDir, { recursive: true, force: true });🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@scripts/build-updater-manifest.test.mjs` around lines 1 - 45, Extend the coverage in buildManifest tests so every guard clause is exercised, not just the missing-version path. Add assertions for the missing-repo case in buildManifest, plus failures when a fragment is incomplete (missing key, asset, or signature) and when the fragments directory is empty, using the existing buildManifest helper and the temporary fragment setup in this test file. Keep the current successful manifest assertions, but add focused throws checks that reference buildManifest and the fragment JSON shape so regressions in these validation paths are caught..github/workflows/release.yml (1)
264-293: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winLinux updater asset extension is wrong
Lines 271-278:*.AppImage)never matches the Linux updater bundle (*.AppImage.tar.gz/.sig), so the fallback setsext="gz". That names tagged Linux releasesRisuko_<version>_<os>_<arch>.gzand breaks the updater URL. Match the full*.AppImage.tar.gzsuffix here.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/workflows/release.yml around lines 264 - 293, The Linux tagged-release asset naming in the release workflow is using the wrong suffix, causing updater bundles to be published with a .gz name. Update the extension handling in the bundle selection logic around the asset creation in the release job so the basename check in the tag branch matches the full .AppImage.tar.gz updater artifact, then keep copying the signed asset and its .sig with the corrected asset name.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/workflows/release.yml:
- Around line 354-360: The new Upload updater fragment step uses an unpinned
actions/upload-artifact@v4 reference, so update the release workflow to pin this
action to a specific commit SHA like the existing Swatinem/rust-cache usage.
Keep the step name and artifact settings in place, and only replace the action
reference in the upload-artifact step to match the repo’s supply-chain hardening
practice.
- Line 265: The release workflow still interpolates github.ref and matrix.target
directly inside run scripts, which static analysis flags as template-injection
risk. Update the affected shell/PowerShell steps to pass these values through
env in the job/step definition and then reference the environment variables
inside the scripts instead of using inline ${{ }} expressions. Apply this
pattern consistently in the release job call sites around the tag check and the
matrix-based commands so the existing workflow logic in release.yml remains
unchanged while reducing injection surface.
- Around line 506-542: The new updater-manifest job in release.yml uses several
third-party actions that are still referenced by version tags, so update the
actions used in the updater-manifest steps (checkout, setup-node,
download-artifact, and action-gh-release) to commit SHAs to match the project’s
pinned-action precedent. Also review the Setup Node.js step to confirm no
unintended caching is enabled by actions/setup-node, and only add an explicit
cache setting if it is intentionally required.
- Around line 333-352: The "Emit updater manifest fragment" step in the release
workflow builds JSON by manually printf’ing interpolated values for key, asset,
and signature, which is fragile if any value contains characters that need
escaping. Update this step to generate the fragment with a JSON-encoding tool or
method instead of hand-assembling the string, and keep the same inputs from the
matrix target, APP_ASSET, and UPDATER_SIG_FILE while preserving the existing
fragment file naming and output behavior.
In `@scripts/build-updater-manifest.mjs`:
- Line 27: The CLI entry-point check in the top-level `import.meta.url`
comparison is using a string path form that is not cross-platform. Update the
`build-updater-manifest.mjs` CLI detection to compare against
`pathToFileURL(process.argv[1]).href` instead of manually interpolating
`process.argv[1]`, so the entry-point check works correctly on Windows and other
platforms.
In `@src-tauri/risuko-engine/src/engine/manager.rs`:
- Around line 2621-2657: `set_task_schedule` has a race because it cancels the
active download before the task status is updated, which can let the
cancellation handler overwrite the intended `Scheduled` state. Update
`set_task_schedule` in `manager.rs` to follow the same ordering as `preempt()`:
first validate the task and set `task.status = TaskStatus::Scheduled` (and
related fields) under the write lock, then cancel any active download token
afterward. Keep the cancellation scoped to only the successful scheduling path
so it does not run before `kind`/`status` checks.
In `@src/renderer/components/Native/EngineClient.vue`:
- Around line 1048-1060: The checkMissedSchedules async path is swallowing fetch
errors, unlike the other handlers in EngineClient.vue that log failures. Update
the catch in checkMissedSchedules to record the rejection with logger.warn using
a clear message and the error object, while keeping the existing missed-task
handling logic unchanged; use the checkMissedSchedules, fetchScheduledTaskList,
and logger.warn symbols to locate the fix.
In `@src/renderer/components/Task/AddTask.vue`:
- Around line 207-215: The torrent submission flow is still inheriting the
shared form.startAt value, so update the AddTask.vue submission logic to clear
or omit the schedule field whenever type is torrent. Check the form handling
around the DateTimePicker and the payload builder for the task submission path,
and ensure the torrent case never includes risuko-start-at even when mixed tasks
were previously scheduled.
In `@src/renderer/components/Task/MissedScheduleDialog.vue`:
- Around line 101-122: The startNow/startAll flow in MissedScheduleDialog.vue is
swallowing start failures and then removing items from missedScheduledTasks
anyway. Update the startNow and startAll methods to handle errors like
ScheduleDialog.vue confirm() does by surfacing a message via
this.$msg?.error?.(...) and only removing a task from the missed list or closing
the dialog after a successful useTaskStore().startNow call; keep the
remaining-task refresh logic in startNow and the loop in startAll consistent
with that behavior.
- Around line 114-122: The startAll method in MissedScheduleDialog.vue is
dispatching missed tasks sequentially by awaiting each
useTaskStore().startNow(t.gid) call inside the loop, which makes N tasks incur N
round-trips. Update startAll to trigger all startNow calls concurrently, ideally
using Promise.allSettled over the pending list, and keep the close() call after
all dispatches complete; preserve or improve error handling so failures are not
silently swallowed.
In `@src/renderer/components/Task/ScheduleDialog.vue`:
- Around line 59-62: The ScheduleDialog task prop is loosely typed as a generic
Object, which drops the DownloadTask shape used by getTaskName, task.gid, and
task?.startAt. Update the props definition in ScheduleDialog.vue to use a
PropType for DownloadTask | null (with the same null default) so the component
stays type-safe and aligned with the rest of the task usage.
In `@src/renderer/components/Task/TaskItem.vue`:
- Around line 5-20: The TaskItem drag handle is pointer-only, so keyboard users
currently have no way to reorder tasks after the move actions were removed.
Update the TaskItem component to expose a keyboard-accessible reorder path on
the task row or drag handle by making it focusable and handling key events to
trigger the same reorder flow used by reorderTasks, or restore an equivalent
menu/shortcut action tied to the existing task actions. Use the TaskItem.vue
template and the reorderTasks/task action wiring as the main reference points
when adding the accessibility path.
In `@src/renderer/components/Task/TaskList.vue`:
- Around line 159-167: The drag cleanup in TaskList is incomplete:
`beforeUnmount` removes the pointer listeners but leaves
`document.body.classList` stuck with `task-dragging`, and there is no
`pointercancel` handling for interrupted drags. Update the drag lifecycle in the
TaskList component by ensuring the same cleanup used by `onDragUp` also runs
during unmount and on pointer cancellation, and wire a `pointercancel` listener
alongside `pointermove`/`pointerup` so the drag state is always cleared even
when the browser aborts the gesture.
- Around line 11-21: Restore a keyboard-accessible reorder path in TaskList and
TaskActions: the current drag-only flow via handle-down on task-item and the
non-focusable drag handle leaves keyboard and screen-reader users unable to move
tasks. Add an accessible reorder mechanism such as focusable move up/down
controls or equivalent keyboard handlers in TaskActions, and ensure TaskList
continues to support reordering through these controls alongside the existing
pointer drag behavior.
- Around line 254-322: The drag lifecycle in TaskList.vue leaves global drag
state behind if the component unmounts or the pointer is canceled, because the
cleanup in onDragUp() is not always reached. Update the drag cleanup path used
by onHandleDown(), onDragUp(), and beforeUnmount() so the same teardown runs in
every exit path: remove the pointermove/pointerup handlers, clear
draggingKeys/dropTargetKey/dropAfter, and always remove the "task-dragging" body
class. Also add pointercancel handling alongside pointerup so canceled drags
fully reset state.
In `@src/renderer/components/TaskDetail/TaskGeneral.vue`:
- Around line 256-265: The countdown timer in TaskGeneral.vue is started
unconditionally in mounted(), so non-scheduled tasks still get a per-second
update loop. Update the mounted()/beforeUnmount() flow to only create and clear
_nowTimer when the current task is scheduled (use isScheduled or the logic that
drives startingAfterText), and avoid setting nowMs for unscheduled tasks. This
should be implemented in the TaskGeneral component’s timer setup so the interval
only runs while needed.
In `@src/renderer/components/ui/date-time-picker/DateTimePicker.vue`:
- Around line 25-29: The DateTimePicker flow can commit a past timestamp when
“today” is selected because defaultTime() may initialize to an already-past 2:00
AM and the hourField/minuteField setters do not validate against Date.now().
Update the DateTimePicker.vue logic around defaultTime and the
hourField/minuteField commit path to prevent selecting a time-of-day earlier
than the current time for the chosen day, either by clamping to the next valid
time or blocking the commit with a clear state update. If a `startAt` is already
in the past at creation time, align this component’s behavior with the engine’s
expected handling and make that handling explicit in the selection/commit logic.
In `@src/renderer/store/task.ts`:
- Around line 820-849: The reorderTasks flow in task store is preserving a stale
optimistic order after api.reorderTasks fails, which causes
fetchList/applyTaskOrder to reapply and persist the wrong order. In
reorderTasks, clear the currentList entry in taskOrderMap before calling
fetchList() inside the catch block so the refetched data is not re-sorted by the
failed optimistic state; keep the existing success path unchanged and make sure
updateTaskOrder is only fed the confirmed order after a successful reorder.
---
Outside diff comments:
In @.github/workflows/release.yml:
- Around line 264-293: The Linux tagged-release asset naming in the release
workflow is using the wrong suffix, causing updater bundles to be published with
a .gz name. Update the extension handling in the bundle selection logic around
the asset creation in the release job so the basename check in the tag branch
matches the full .AppImage.tar.gz updater artifact, then keep copying the signed
asset and its .sig with the corrected asset name.
In `@scripts/build-updater-manifest.test.mjs`:
- Around line 1-45: Extend the coverage in buildManifest tests so every guard
clause is exercised, not just the missing-version path. Add assertions for the
missing-repo case in buildManifest, plus failures when a fragment is incomplete
(missing key, asset, or signature) and when the fragments directory is empty,
using the existing buildManifest helper and the temporary fragment setup in this
test file. Keep the current successful manifest assertions, but add focused
throws checks that reference buildManifest and the fragment JSON shape so
regressions in these validation paths are caught.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: bdcac178-4d5a-474f-afdd-b398fe7cd498
📒 Files selected for processing (42)
.github/workflows/release.ymlREADME-CN.mdREADME.mdscripts/build-updater-manifest.mjsscripts/build-updater-manifest.test.mjssrc-tauri/risuko-engine/src/engine/manager.rssrc-tauri/risuko-engine/src/engine/task.rssrc-tauri/src/commands/engine_cmds.rssrc-tauri/src/lib.rssrc-tauri/src/managers/clip_prompt.rssrc-tauri/src/managers/menu.rssrc/renderer/api/Api.tssrc/renderer/components/About/Copyright.vuesrc/renderer/components/Main.vuesrc/renderer/components/Native/EngineClient.vuesrc/renderer/components/Sidebar/Index.vuesrc/renderer/components/Task/AddTask.vuesrc/renderer/components/Task/Index.vuesrc/renderer/components/Task/MissedScheduleDialog.vuesrc/renderer/components/Task/ScheduleDialog.vuesrc/renderer/components/Task/TaskActions.vuesrc/renderer/components/Task/TaskItem.vuesrc/renderer/components/Task/TaskItemActions.vuesrc/renderer/components/Task/TaskList.vuesrc/renderer/components/Task/TaskStatus.vuesrc/renderer/components/TaskDetail/TaskGeneral.vuesrc/renderer/components/ui/date-time-picker/DateTimePicker.vuesrc/renderer/components/ui/date-time-picker/index.tssrc/renderer/pages/index/commands.tssrc/renderer/pages/index/main.tssrc/renderer/store/app.tssrc/renderer/store/batchQueue.tssrc/renderer/store/task.tssrc/renderer/styles/components/task.csssrc/renderer/utils/task.tssrc/shared/constants.tssrc/shared/locales/en-US/task.tssrc/shared/locales/zh-CN/task.tssrc/shared/locales/zh-TW/task.tssrc/shared/syncCategories.tssrc/shared/types/task.tssrc/shared/utils/index.ts
💤 Files with no reviewable changes (3)
- src/renderer/components/Task/TaskActions.vue
- src/renderer/pages/index/main.ts
- src/renderer/pages/index/commands.ts
| mounted() { | ||
| this._nowTimer = setInterval(() => { | ||
| this.nowMs = Date.now(); | ||
| }, 1000); | ||
| }, | ||
| beforeUnmount() { | ||
| if (this._nowTimer) { | ||
| clearInterval(this._nowTimer); | ||
| } | ||
| }, |
There was a problem hiding this comment.
🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win
Countdown timer runs unconditionally for every task, scheduled or not.
_nowTimer is started in mounted() regardless of whether the currently displayed task isScheduled, ticking every second and recomputing startingAfterText/triggering re-renders for the (much more common) non-scheduled case too.
♻️ Suggested fix: only tick while scheduled
mounted() {
- this._nowTimer = setInterval(() => {
- this.nowMs = Date.now();
- }, 1000);
+ this._nowTimer = setInterval(() => {
+ if (this.isScheduled) {
+ this.nowMs = Date.now();
+ }
+ }, 1000);
},📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| mounted() { | |
| this._nowTimer = setInterval(() => { | |
| this.nowMs = Date.now(); | |
| }, 1000); | |
| }, | |
| beforeUnmount() { | |
| if (this._nowTimer) { | |
| clearInterval(this._nowTimer); | |
| } | |
| }, | |
| mounted() { | |
| this._nowTimer = setInterval(() => { | |
| if (this.isScheduled) { | |
| this.nowMs = Date.now(); | |
| } | |
| }, 1000); | |
| }, | |
| beforeUnmount() { | |
| if (this._nowTimer) { | |
| clearInterval(this._nowTimer); | |
| } | |
| }, |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/renderer/components/TaskDetail/TaskGeneral.vue` around lines 256 - 265,
The countdown timer in TaskGeneral.vue is started unconditionally in mounted(),
so non-scheduled tasks still get a per-second update loop. Update the
mounted()/beforeUnmount() flow to only create and clear _nowTimer when the
current task is scheduled (use isScheduled or the logic that drives
startingAfterText), and avoid setting nowMs for unscheduled tasks. This should
be implemented in the TaskGeneral component’s timer setup so the interval only
runs while needed.
There was a problem hiding this comment.
Actionable comments posted: 12
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
src/renderer/components/Native/EngineClient.vue (1)
1048-1057: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winPaginate the startup missed-schedule check
checkMissedSchedules()callsfetchScheduledTaskList()with default paging (num: TASK_LIST_FETCH_SIZE= 5000), so any scheduled tasks beyond the first page are skipped on startup.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/renderer/components/Native/EngineClient.vue` around lines 1048 - 1057, The startup missed-schedule scan in checkMissedSchedules() only reads the first page from fetchScheduledTaskList(), so tasks beyond the default TASK_LIST_FETCH_SIZE can be missed. Update the logic to page through all scheduled tasks before filtering for scheduleMissed, using the existing api.fetchScheduledTaskList flow and keeping the useAppStore().showMissedScheduled call on the full accumulated result.src/renderer/components/Task/ScheduleDialog.vue (1)
106-111: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winAdd
task.schedule-task-failto the missing locale bundles. It exists inen-US,zh-TW, andzh-CN, but not inru,th, ortr, so those locales won’t get a localized failure message.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/renderer/components/Task/ScheduleDialog.vue` around lines 106 - 111, The ScheduleDialog.vue error path already falls back to task.schedule-task-fail via this.$t in the catch block, but that key is missing from some locale bundles. Add the task.schedule-task-fail translation to the ru, th, and tr locale files so useTaskStore().setSchedule failures show a localized message consistently across all supported languages.src/renderer/components/Task/Index.vue (1)
676-686: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winInconsistent error handling in
handleStartTaskNow.Every other handler here (
handleResumeTask,handlePauseTask, etc.) gates the localized error message behinderr.code === 1and always shows a translated string.handleStartTaskNowinstead prefers(err as Error)?.message, which can surface a raw/internal error string (e.g., from the Tauri/engine layer) directly to the user instead of a localized message.Proposed fix to align with sibling handlers
handleStartTaskNow(payload) { const { task, taskName } = payload; useTaskStore() .startNow(task.gid) - .catch((err: unknown) => { - this.$msg.error( - (err as Error)?.message || - this.$t("task.start-now-task-fail", { taskName }), - ); - }); + .catch(({ code }) => { + if (code === 1) { + this.$msg.error( + this.$t("task.start-now-task-fail", { taskName }), + ); + } + }); },🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/renderer/components/Task/Index.vue` around lines 676 - 686, `handleStartTaskNow` is handling errors differently from the sibling task actions and can leak raw engine/Tauri messages to users. Update the `useTaskStore().startNow(task.gid).catch(...)` block in `Index.vue` to match `handleResumeTask`/`handlePauseTask` by checking `err.code === 1` and otherwise always falling back to the translated `task.start-now-task-fail` message using `taskName`. Keep the error handling pattern consistent with the other handlers and avoid using `(err as Error)?.message` as the primary user-facing message.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/workflows/release.yml:
- Line 241: The release workflow is referencing an undefined matrix property, so
the linker env var is always empty and triggers lint errors. Update the workflow
around the existing CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER entry to
either remove the dead matrix.linker reference or add a real linker field to the
matrix/include definitions if armv7 support is intended. Make the same
correction anywhere else the same matrix.linker reference appears so the
workflow only uses defined matrix keys.
In `@src/shared/locales/ar/task.ts`:
- Around line 70-71: The new task locale entries in the ar task translation file
are still in English, so replace `start-now-fail`, `start-now-task-fail`, and
`reorder-task` with proper Arabic translations to match the rest of the locale
module. Also remove or retire the unused `move-task-up` and `move-task-down`
entries from the same task locale object since the related actions were removed,
and apply the same translation cleanup pattern in the other touched locale files
(for example the corresponding task locale definitions).
In `@src/shared/locales/de/task.ts`:
- Around line 71-72: The German locale entries in task.ts still contain English
placeholder text for start-now-fail, start-now-task-fail, and reorder-task.
Update the affected string values in the task translation object to proper
German equivalents, and make sure the same fix is applied to the related
reordered entry referenced by the comment. Use the existing locale key names to
locate and replace only the untranslated strings.
- Around line 71-72: Add the missing German scheduling entries in the task
locale object in task.ts so the scheduling UI no longer falls back to English.
Update the translation map alongside the existing task keys to include the
missing symbols such as scheduled, schedule-task, reschedule-task,
schedule-dialog-title, schedule-dialog-hint, schedule-pick-time,
schedule-confirm, schedule-start-at, schedule-start-at-placeholder,
starting-after, and the missed-schedule-* variants, keeping the naming and
interpolation style consistent with the existing task translations.
In `@src/shared/locales/el/task.ts`:
- Around line 72-73: The Greek locale entries still contain English strings for
the task-related keys. Update the translations in the el task locale object for
start-now-fail, start-now-task-fail, and reorder-task so they are fully
translated into Greek, keeping the existing placeholder symbol taskName intact.
Use the task.ts locale entries to locate and replace the untranslated values.
- Around line 72-73: The Greek locale in task.ts is missing the new scheduling
and missed-schedule translation keys, so add the same `scheduled`, `schedule-*`,
and `missed-schedule-*` entries that exist in the other locales. Update the
`el/task.ts` message map alongside the existing `start-now-*` keys, keeping the
key names consistent with the shared task locale structure so the Schedule and
Missed-Schedule dialogs can resolve Greek strings.
In `@src/shared/locales/es/task.ts`:
- Around line 72-73: The Spanish locale in task.ts still contains untranslated
English entries, so update the affected keys to proper Spanish. Edit the task
translation object and replace the values for start-now-fail,
start-now-task-fail, and reorder-task with Spanish text, keeping the existing
placeholders like {{taskName}} intact and ensuring the surrounding locale
entries remain consistent.
- Around line 72-73: The Spanish task locale is missing the full scheduling
block, so add the new scheduled-task strings to task.ts alongside the existing
start-now entries. Update the es locale object to include the scheduling-related
keys referenced by the UI, including scheduled, schedule-task, reschedule-task,
schedule-dialog-title, schedule-dialog-hint, schedule-pick-time,
schedule-confirm, schedule-start-at, schedule-start-at-placeholder,
starting-after, and the missed-schedule-* messages, keeping the translations
consistent with the existing Task locale structure.
In `@src/shared/locales/fa/task.ts`:
- Around line 70-71: The locale entries in task.ts still contain English strings
for the Persian bundle, specifically the keys start-now-fail,
start-now-task-fail, and reorder-task. Update these translations in the fa
locale object so they are fully localized to Persian while preserving any
placeholders such as {{taskName}}. Use the existing task translation keys in the
same export to locate and replace the untranslated values.
- Around line 70-71: The Persian task locale in task.ts is missing the
scheduling-related translation keys, so add the full scheduled, schedule-*, and
missed-schedule-* set there, including schedule-task-fail, alongside the
existing start-now entries. Use the existing task translation object structure
in src/shared/locales/fa/task.ts to insert the missing keys so the scheduling UI
resolves Persian strings instead of falling back to English.
In `@src/shared/locales/zh-CN/task.ts`:
- Around line 159-160: The newly added scheduling locale entries in task.ts
still contain English text, so translate the affected keys to Chinese to match
the rest of this locale file. Update the string values for start-now-fail,
start-now-task-fail, schedule-task-fail, and reorder-task in the zh-CN task
dictionary, keeping the existing placeholders like {{taskName}} intact.
In `@src/shared/locales/zh-TW/task.ts`:
- Around line 159-160: The zh-TW task locale still has untranslated scheduling
keys mixed in with translated content. Update the string values for
schedule-task-fail, start-now-fail, start-now-task-fail, and reorder-task in the
task locale object so they are in Traditional Chinese, matching the surrounding
entries. Use the existing locale keys in task.ts to locate and replace the
English placeholders without changing the key names or interpolation tokens like
"{{taskName}}".
---
Outside diff comments:
In `@src/renderer/components/Native/EngineClient.vue`:
- Around line 1048-1057: The startup missed-schedule scan in
checkMissedSchedules() only reads the first page from fetchScheduledTaskList(),
so tasks beyond the default TASK_LIST_FETCH_SIZE can be missed. Update the logic
to page through all scheduled tasks before filtering for scheduleMissed, using
the existing api.fetchScheduledTaskList flow and keeping the
useAppStore().showMissedScheduled call on the full accumulated result.
In `@src/renderer/components/Task/Index.vue`:
- Around line 676-686: `handleStartTaskNow` is handling errors differently from
the sibling task actions and can leak raw engine/Tauri messages to users. Update
the `useTaskStore().startNow(task.gid).catch(...)` block in `Index.vue` to match
`handleResumeTask`/`handlePauseTask` by checking `err.code === 1` and otherwise
always falling back to the translated `task.start-now-task-fail` message using
`taskName`. Keep the error handling pattern consistent with the other handlers
and avoid using `(err as Error)?.message` as the primary user-facing message.
In `@src/renderer/components/Task/ScheduleDialog.vue`:
- Around line 106-111: The ScheduleDialog.vue error path already falls back to
task.schedule-task-fail via this.$t in the catch block, but that key is missing
from some locale bundles. Add the task.schedule-task-fail translation to the ru,
th, and tr locale files so useTaskStore().setSchedule failures show a localized
message consistently across all supported languages.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 4dc45a6e-4f98-49e0-9e09-7f91e13b7aee
📒 Files selected for processing (40)
.github/workflows/release.ymlscripts/build-updater-manifest.mjsscripts/build-updater-manifest.test.mjssrc-tauri/risuko-engine/src/engine/manager.rssrc-tauri/src/commands/engine_cmds.rssrc/renderer/components/Native/EngineClient.vuesrc/renderer/components/Task/Index.vuesrc/renderer/components/Task/MissedScheduleDialog.vuesrc/renderer/components/Task/ScheduleDialog.vuesrc/renderer/components/Task/TaskItem.vuesrc/renderer/components/Task/TaskList.vuesrc/renderer/components/ui/date-time-picker/DateTimePicker.vuesrc/renderer/store/task.tssrc/renderer/utils/task.tssrc/shared/locales/ar/task.tssrc/shared/locales/bg/task.tssrc/shared/locales/ca/task.tssrc/shared/locales/de/task.tssrc/shared/locales/el/task.tssrc/shared/locales/en-US/task.tssrc/shared/locales/es/task.tssrc/shared/locales/fa/task.tssrc/shared/locales/fr/task.tssrc/shared/locales/hu/task.tssrc/shared/locales/id/task.tssrc/shared/locales/it/task.tssrc/shared/locales/ja/task.tssrc/shared/locales/ko/task.tssrc/shared/locales/nb/task.tssrc/shared/locales/nl/task.tssrc/shared/locales/pl/task.tssrc/shared/locales/pt-BR/task.tssrc/shared/locales/ro/task.tssrc/shared/locales/ru/task.tssrc/shared/locales/th/task.tssrc/shared/locales/tr/task.tssrc/shared/locales/uk/task.tssrc/shared/locales/vi/task.tssrc/shared/locales/zh-CN/task.tssrc/shared/locales/zh-TW/task.ts
| env: | ||
| MATRIX_TARGET: ${{ matrix.target }} | ||
| TAURI_ARGS: ${{ matrix.tauri_args }} | ||
| CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER: ${{ matrix.linker }} |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
matrix.linker is undefined — this env var always resolves to empty.
None of the matrix.include entries define a linker key (only os, platform, target, tauri_args), and there is no armv7 target in the matrix, so CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER is set to an empty string and actionlint errors on the undefined property. Either drop this dead env entry or add the missing linker matrix field if it was intended. The same reference also exists at Line 228.
♻️ Suggested change
env:
MATRIX_TARGET: ${{ matrix.target }}
TAURI_ARGS: ${{ matrix.tauri_args }}
- CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER: ${{ matrix.linker }}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER: ${{ matrix.linker }} |
🧰 Tools
🪛 actionlint (1.7.12)
[error] 241-241: property "linker" is not defined in object type {os: string; platform: string; target: string; tauri_args: string}
(expression)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.github/workflows/release.yml at line 241, The release workflow is
referencing an undefined matrix property, so the linker env var is always empty
and triggers lint errors. Update the workflow around the existing
CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER entry to either remove the
dead matrix.linker reference or add a real linker field to the matrix/include
definitions if armv7 support is intended. Make the same correction anywhere else
the same matrix.linker reference appears so the workflow only uses defined
matrix keys.
Source: Linters/SAST tools
| "start-now-fail": "Failed to start scheduled task", | ||
| "start-now-task-fail": 'Failed to start task "{{taskName}}"', |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
New locale strings left untranslated.
start-now-fail, start-now-task-fail, and reorder-task are added with plain English text instead of Arabic translations, unlike every other entry in this file. This same pattern repeats across the other locale files in this batch (bg, ca, uk, vi) and likely the rest of the ~25 locale files touched by this PR.
Also note move-task-up/move-task-down (lines 85-86) remain defined even though the Move Up/Down actions are removed in this PR (per the "Drag-and-drop reorder and move-up/down removal" layer) — these are now likely dead locale entries.
Also applies to: 84-84
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/shared/locales/ar/task.ts` around lines 70 - 71, The new task locale
entries in the ar task translation file are still in English, so replace
`start-now-fail`, `start-now-task-fail`, and `reorder-task` with proper Arabic
translations to match the rest of the locale module. Also remove or retire the
unused `move-task-up` and `move-task-down` entries from the same task locale
object since the related actions were removed, and apply the same translation
cleanup pattern in the other touched locale files (for example the corresponding
task locale definitions).
| "start-now-fail": "Failed to start scheduled task", | ||
| "start-now-task-fail": 'Failed to start task "{{taskName}}"', |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
Untranslated placeholder strings.
start-now-fail, start-now-task-fail, and reorder-task are left in English rather than German.
Also applies to: 87-87
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/shared/locales/de/task.ts` around lines 71 - 72, The German locale
entries in task.ts still contain English placeholder text for start-now-fail,
start-now-task-fail, and reorder-task. Update the affected string values in the
task translation object to proper German equivalents, and make sure the same fix
is applied to the related reordered entry referenced by the comment. Use the
existing locale key names to locate and replace only the untranslated strings.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Identify locale files and relevant component references.
git ls-files 'src/shared/locales/*/task.ts' 'src/**/ScheduleDialog.vue' 'src/**/MissedScheduleDialog.vue'
echo '--- key search ---'
rg -n '"scheduled"|"schedule-task"|"reschedule-task"|"schedule-dialog-title"|"schedule-dialog-hint"|"schedule-pick-time"|"schedule-confirm"|"schedule-start-at"|"starting-after"|"missed-schedule-' \
src/shared/locales src -g '!**/node_modules/**'
echo '--- de task locale ---'
cat -n src/shared/locales/de/task.ts | sed -n '1,220p'
echo '--- en-US task locale ---'
cat -n src/shared/locales/en-US/task.ts | sed -n '1,260p'
echo '--- zh-CN task locale ---'
cat -n src/shared/locales/zh-CN/task.ts | sed -n '1,260p'
echo '--- zh-TW task locale ---'
cat -n src/shared/locales/zh-TW/task.ts | sed -n '1,260p'
echo '--- component references ---'
rg -n 'schedule-dialog-title|schedule-dialog-hint|schedule-pick-time|schedule-confirm|schedule-start-at|starting-after|missed-schedule-|schedule-task|reschedule-task|scheduled' \
src -g '*.vue' -g '*.ts' -g '*.tsx' -g '*.js' -g '*.jsx'Repository: YueMiyuki/Risuko
Length of output: 50372
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Focus on the scheduling dialog components to map exact i18n key usage.
ast-grep outline src -g 'ScheduleDialog.vue' -g 'MissedScheduleDialog.vue' --view expanded
echo '--- ScheduleDialog.vue references ---'
rg -n 't\(|\$t\(|i18n|schedule-|missed-schedule-' src -g 'ScheduleDialog.vue' -g 'MissedScheduleDialog.vue'Repository: YueMiyuki/Risuko
Length of output: 320
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Compare task locale keys and component i18n usage.
python3 - <<'PY'
from pathlib import Path
import re, json
files = [
Path('src/shared/locales/de/task.ts'),
Path('src/shared/locales/en-US/task.ts'),
Path('src/shared/locales/zh-CN/task.ts'),
Path('src/shared/locales/zh-TW/task.ts'),
]
keys = {}
for p in files:
text = p.read_text(encoding='utf-8')
found = re.findall(r'^\s*["\']([^"\']+)["\']\s*:\s*', text, flags=re.M)
keys[p.as_posix()] = found
print(f'## {p}')
print('\n'.join(found))
print()
base = set(keys[files[0].as_posix()])
for p in files[1:]:
missing = [k for k in keys[p.as_posix()] if k not in base]
extra = [k for k in base if k not in keys[p.as_posix()]]
print(f'## diff de vs {p}')
print('missing in de:', missing)
print('extra in de:', extra)
print()
PY
echo '--- component key usages ---'
rg -n 'schedule-dialog-title|schedule-dialog-hint|schedule-pick-time|schedule-confirm|schedule-start-at|starting-after|missed-schedule-|schedule-task|reschedule-task|scheduled' \
src -g '*.vue' -g '*.ts' -g '*.tsx' -g '*.js' -g '*.jsx'Repository: YueMiyuki/Risuko
Length of output: 41988
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Inspect locale loading / fallback behavior for task locales.
rg -n 'locales/.*/task|task\.ts|fallbackLocale|messages|merge.*locale|deep.*merge|Object\.assign|spread.*task' src -g '*.ts' -g '*.tsx' -g '*.js' -g '*.vue'
echo '--- locale index files ---'
git ls-files 'src/shared/locales/**/index.*' 'src/shared/locales/**/task.ts' 'src/shared/i18n.*' 'src/**/i18n.*'Repository: YueMiyuki/Risuko
Length of output: 2160
🏁 Script executed:
#!/bin/bash
set -euo pipefail
python3 - <<'PY'
from pathlib import Path
import re
def keys(path):
text = Path(path).read_text(encoding='utf-8')
return [m.group(1) for m in re.finditer(r'^\s*["\']([^"\']+)["\']\s*:\s*', text, re.M)]
paths = [
'src/shared/locales/de/task.ts',
'src/shared/locales/en-US/task.ts',
'src/shared/locales/zh-CN/task.ts',
'src/shared/locales/zh-TW/task.ts',
]
all_keys = {p: keys(p) for p in paths}
for p, ks in all_keys.items():
print(f'{p}: {len(ks)} keys')
print(', '.join(ks))
print()
de = set(all_keys[paths[0]])
for p in paths[1:]:
other = set(all_keys[p])
print(f'Missing from de vs {p}:')
print(', '.join(sorted(other - de)))
print()
PY
echo '--- references in scheduling components ---'
rg -n 'schedule-dialog-title|schedule-dialog-hint|schedule-pick-time|schedule-confirm|schedule-start-at|starting-after|missed-schedule-|schedule-task|reschedule-task|scheduled' \
src -g 'ScheduleDialog.vue' -g 'MissedScheduleDialog.vue' -g '*.ts' -g '*.vue'Repository: YueMiyuki/Risuko
Length of output: 41963
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Inspect i18n initialization and locale fallback behavior.
git ls-files 'src/**/i18n.*' 'src/**/locale*' 'src/**/locales/**/index.ts' 'src/**/locales/**/task.ts'
echo '--- i18n-related files ---'
rg -n 'createI18n|fallbackLocale|missing|fallback|locale' src -g '*.ts' -g '*.tsx' -g '*.js' -g '*.vue' | sed -n '1,220p'
echo '--- possible locale entrypoints ---'
for f in src/shared/locales/*/index.ts src/shared/locales/en-US/index.ts src/renderer/*i18n* src/shared/*i18n*; do
[ -e "$f" ] && echo "$f"
doneRepository: YueMiyuki/Risuko
Length of output: 27551
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Narrowly inspect the i18n setup files for fallback locale semantics.
fd -a 'i18n' src || true
fd -a 'locale' src/shared src/renderer || true
echo '--- createI18n / fallbackLocale hits ---'
rg -n 'createI18n|fallbackLocale|missing|localeMessages|messages\s*:' src -g '*.ts' -g '*.tsx' -g '*.js' -g '*.vue' | sed -n '1,220p'Repository: YueMiyuki/Risuko
Length of output: 3023
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Read the likely i18n bootstrapping files if present.
for f in \
src/shared/i18n.ts \
src/shared/i18n.js \
src/renderer/i18n.ts \
src/renderer/i18n.js \
src/main/i18n.ts \
src/main/i18n.js \
src/shared/locales/en-US/index.ts \
src/shared/locales/de/index.ts
do
if [ -f "$f" ]; then
echo "--- $f ---"
cat -n "$f" | sed -n '1,220p'
fi
doneRepository: YueMiyuki/Risuko
Length of output: 1567
🏁 Script executed:
#!/bin/bash
set -euo pipefail
cat -n src/shared/locales/LocaleManager.ts | sed -n '1,220p'
echo '---'
cat -n src/shared/locales/loader.ts | sed -n '1,220p'Repository: YueMiyuki/Risuko
Length of output: 3965
Add the missing scheduling translations to src/shared/locales/de/task.ts. German users will get English fallback text in the scheduling UI until keys like scheduled, schedule-task, reschedule-task, schedule-dialog-title, schedule-dialog-hint, schedule-pick-time, schedule-confirm, schedule-start-at, schedule-start-at-placeholder, starting-after, and missed-schedule-* are added.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/shared/locales/de/task.ts` around lines 71 - 72, Add the missing German
scheduling entries in the task locale object in task.ts so the scheduling UI no
longer falls back to English. Update the translation map alongside the existing
task keys to include the missing symbols such as scheduled, schedule-task,
reschedule-task, schedule-dialog-title, schedule-dialog-hint,
schedule-pick-time, schedule-confirm, schedule-start-at,
schedule-start-at-placeholder, starting-after, and the missed-schedule-*
variants, keeping the naming and interpolation style consistent with the
existing task translations.
| "start-now-fail": "Failed to start scheduled task", | ||
| "start-now-task-fail": 'Failed to start task "{{taskName}}"', |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
Untranslated placeholder strings.
start-now-fail, start-now-task-fail, and reorder-task remain in English instead of Greek.
Also applies to: 88-88
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/shared/locales/el/task.ts` around lines 72 - 73, The Greek locale entries
still contain English strings for the task-related keys. Update the translations
in the el task locale object for start-now-fail, start-now-task-fail, and
reorder-task so they are fully translated into Greek, keeping the existing
placeholder symbol taskName intact. Use the task.ts locale entries to locate and
replace the untranslated values.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Locate the locale files involved in the review comment.
git ls-files 'src/shared/locales/**/task.ts' | sort
printf '\n--- grep for schedule-related keys in Greek and other locales ---\n'
for f in \
src/shared/locales/el/task.ts \
src/shared/locales/en-US/task.ts \
src/shared/locales/zh-CN/task.ts \
src/shared/locales/zh-TW/task.ts
do
if [ -f "$f" ]; then
printf '\n### %s ###\n' "$f"
rg -n '"(scheduled|schedule-task|reschedule-task|schedule-dialog-title|schedule-dialog-hint|schedule-pick-time|schedule-confirm|schedule-start-at|schedule-start-at-placeholder|starting-after|missed-schedule-)' "$f" || true
fi
done
printf '\n--- show surrounding lines around the Greek scheduling area ---\n'
if [ -f src/shared/locales/el/task.ts ]; then
rg -n -A 40 -B 20 '"start-now-fail"|"start-now-task-fail"|scheduled|schedule' src/shared/locales/el/task.ts
fiRepository: YueMiyuki/Risuko
Length of output: 6524
Add the missing scheduling locale keys to src/shared/locales/el/task.ts.
The Greek locale still lacks the new scheduled/schedule-*/missed-schedule-* entries that exist in en-US, zh-CN, and zh-TW, so the Schedule and Missed-Schedule dialogs will fall back to defaults for Greek users.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/shared/locales/el/task.ts` around lines 72 - 73, The Greek locale in
task.ts is missing the new scheduling and missed-schedule translation keys, so
add the same `scheduled`, `schedule-*`, and `missed-schedule-*` entries that
exist in the other locales. Update the `el/task.ts` message map alongside the
existing `start-now-*` keys, keeping the key names consistent with the shared
task locale structure so the Schedule and Missed-Schedule dialogs can resolve
Greek strings.
| "start-now-fail": "Failed to start scheduled task", | ||
| "start-now-task-fail": 'Failed to start task "{{taskName}}"', |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
Untranslated placeholder strings.
start-now-fail, start-now-task-fail, and reorder-task are left in English rather than Spanish.
Also applies to: 88-88
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/shared/locales/es/task.ts` around lines 72 - 73, The Spanish locale in
task.ts still contains untranslated English entries, so update the affected keys
to proper Spanish. Edit the task translation object and replace the values for
start-now-fail, start-now-task-fail, and reorder-task with Spanish text, keeping
the existing placeholders like {{taskName}} intact and ensuring the surrounding
locale entries remain consistent.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Show the relevant locale files and locate scheduling-related keys.
git ls-files 'src/shared/locales/**/task.ts' | sort
printf '\n--- Spanish task.ts keys around scheduling ---\n'
python3 - <<'PY'
from pathlib import Path
p = Path('src/shared/locales/es/task.ts')
text = p.read_text()
for i, line in enumerate(text.splitlines(), 1):
if any(k in line for k in ['scheduled', 'schedule-', 'reschedule', 'starting-after', 'missed-schedule', 'start-now']):
print(f"{i}: {line}")
PY
printf '\n--- Compare key presence across locales ---\n'
python3 - <<'PY'
from pathlib import Path
import re
locales = ['en-US', 'zh-CN', 'zh-TW', 'de', 'el', 'fa', 'es']
keys = {}
for loc in locales:
p = Path(f'src/shared/locales/{loc}/task.ts')
if not p.exists():
continue
text = p.read_text()
found = set(re.findall(r'^\s*["\']([^"\']+)["\']\s*:', text, re.M))
keys[loc] = found
interesting = [
'scheduled',
'schedule-task',
'reschedule-task',
'schedule-dialog-title',
'schedule-dialog-hint',
'schedule-pick-time',
'schedule-confirm',
'schedule-start-at',
'schedule-start-at-placeholder',
'starting-after',
'missed-schedule-title',
'missed-schedule-text',
'missed-schedule-confirm',
]
for key in interesting:
present = [loc for loc, ks in keys.items() if key in ks]
print(f"{key}: {present}")
PY
printf '\n--- Relevant excerpt from English locale ---\n'
python3 - <<'PY'
from pathlib import Path
p = Path('src/shared/locales/en-US/task.ts')
lines = p.read_text().splitlines()
for i, line in enumerate(lines, 1):
if any(k in line for k in ['scheduled', 'schedule-', 'reschedule', 'starting-after', 'missed-schedule', 'start-now']):
print(f"{i}: {line}")
PYRepository: YueMiyuki/Risuko
Length of output: 2698
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Inspect the structure around the Spanish locale file if scheduling keys are missing.
sed -n '1,220p' src/shared/locales/es/task.tsRepository: YueMiyuki/Risuko
Length of output: 7050
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Focus on the Spanish locale and the full scheduling block in the English source.
python3 - <<'PY'
from pathlib import Path
import re
for loc in ['en-US', 'es', 'de', 'el', 'fa', 'zh-CN', 'zh-TW']:
p = Path(f'src/shared/locales/{loc}/task.ts')
if not p.exists():
continue
print(f"\n### {loc}")
txt = p.read_text()
# Print all keys once, in file order, so the scheduling block placement is obvious.
for i, line in enumerate(txt.splitlines(), 1):
m = re.match(r'^\s*["\']([^"\']+)["\']\s*:', line)
if m:
k = m.group(1)
if any(prefix in k for prefix in ['schedule', 'reschedule', 'starting-after', 'missed-schedule']) or k.startswith('start-now') or k == 'scheduled':
print(f"{i}: {line}")
PYRepository: YueMiyuki/Risuko
Length of output: 2910
Add the missing scheduling locale block to Spanish. src/shared/locales/es/task.ts still only has the start-now-* strings; the new scheduling UI will fall back to English/missing keys for Spanish users until scheduled, schedule-task, reschedule-task, schedule-dialog-title/hint, schedule-pick-time, schedule-confirm, schedule-start-at(-placeholder), starting-after, and missed-schedule-* are added.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/shared/locales/es/task.ts` around lines 72 - 73, The Spanish task locale
is missing the full scheduling block, so add the new scheduled-task strings to
task.ts alongside the existing start-now entries. Update the es locale object to
include the scheduling-related keys referenced by the UI, including scheduled,
schedule-task, reschedule-task, schedule-dialog-title, schedule-dialog-hint,
schedule-pick-time, schedule-confirm, schedule-start-at,
schedule-start-at-placeholder, starting-after, and the missed-schedule-*
messages, keeping the translations consistent with the existing Task locale
structure.
| "start-now-fail": "Failed to start scheduled task", | ||
| "start-now-task-fail": 'Failed to start task "{{taskName}}"', |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
Untranslated placeholder strings.
start-now-fail, start-now-task-fail, and reorder-task remain in English instead of Persian.
Also applies to: 85-85
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/shared/locales/fa/task.ts` around lines 70 - 71, The locale entries in
task.ts still contain English strings for the Persian bundle, specifically the
keys start-now-fail, start-now-task-fail, and reorder-task. Update these
translations in the fa locale object so they are fully localized to Persian
while preserving any placeholders such as {{taskName}}. Use the existing task
translation keys in the same export to locate and replace the untranslated
values.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Find relevant locale files
git ls-files 'src/shared/locales/**/task.ts' | sort
echo '--- fa/task.ts keys ---'
sed -n '1,220p' src/shared/locales/fa/task.ts
echo '--- en-US/task.ts keys ---'
sed -n '1,260p' src/shared/locales/en-US/task.ts
echo '--- zh-CN/task.ts keys ---'
sed -n '1,260p' src/shared/locales/zh-CN/task.ts
echo '--- zh-TW/task.ts keys ---'
sed -n '1,260p' src/shared/locales/zh-TW/task.ts
echo '--- other locales with schedule-ish keys ---'
rg -n '"scheduled"|"schedule-task"|"reschedule-task"|"schedule-dialog-title"|"schedule-pick-time"|"schedule-confirm"|"schedule-start-at"|"starting-after"|"missed-schedule-' src/shared/locales -g 'task.ts'Repository: YueMiyuki/Risuko
Length of output: 42280
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Inspect i18n fallback behavior and whether fa is listed as a supported locale.
rg -n "fallback|missingKey|locale|locales" src -g '!**/dist/**' -g '!**/build/**' -g '!**/node_modules/**'
echo '--- likely i18n config files ---'
git ls-files | rg 'i18n|locale|locales|translation'
echo '--- search for Persian locale registration ---'
rg -n '"fa"|fa/' src -g '!**/dist/**' -g '!**/build/**' -g '!**/node_modules/**'Repository: YueMiyuki/Risuko
Length of output: 24114
🏁 Script executed:
#!/bin/bash
set -euo pipefail
python3 - <<'PY'
import re
from pathlib import Path
def extract_keys(path):
text = Path(path).read_text(encoding='utf-8')
# grab "key": or key: entries inside the exported object
keys = []
for m in re.finditer(r'^\s*(?:"([^"]+)"|([A-Za-z0-9_-]+))\s*:', text, re.M):
keys.append(m.group(1) or m.group(2))
return keys
fa = set(extract_keys('src/shared/locales/fa/task.ts'))
en = set(extract_keys('src/shared/locales/en-US/task.ts'))
schedule_keys = [
'scheduled',
'schedule-task',
'schedule-task-fail',
'reschedule-task',
'schedule-dialog-title',
'schedule-dialog-hint',
'schedule-pick-time',
'schedule-confirm',
'schedule-start-at',
'schedule-start-at-placeholder',
'starting-after',
'missed-schedule-title',
'missed-schedule-hint',
'missed-schedule-dismiss',
'missed-schedule-start-all',
]
print('Missing in fa:', [k for k in schedule_keys if k not in fa])
print('Present in fa:', [k for k in schedule_keys if k in fa])
print('fa total keys:', len(fa), 'en total keys:', len(en))
PYRepository: YueMiyuki/Risuko
Length of output: 565
Missing scheduling translations in src/shared/locales/fa/task.ts. Add the scheduled/schedule-*/missed-schedule-* keys (including schedule-task-fail) so the scheduling UI doesn’t fall back to English for Persian users.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/shared/locales/fa/task.ts` around lines 70 - 71, The Persian task locale
in task.ts is missing the scheduling-related translation keys, so add the full
scheduled, schedule-*, and missed-schedule-* set there, including
schedule-task-fail, alongside the existing start-now entries. Use the existing
task translation object structure in src/shared/locales/fa/task.ts to insert the
missing keys so the scheduling UI resolves Persian strings instead of falling
back to English.
| "start-now-fail": "Failed to start scheduled task", | ||
| "start-now-task-fail": 'Failed to start task "{{taskName}}"', |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
Untranslated placeholder strings.
start-now-fail, start-now-task-fail, and reorder-task (and schedule-task-fail at line 9) remain in English rather than Chinese, unlike the rest of the newly added scheduling strings in this file which are translated.
Also applies to: 171-171
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/shared/locales/zh-CN/task.ts` around lines 159 - 160, The newly added
scheduling locale entries in task.ts still contain English text, so translate
the affected keys to Chinese to match the rest of this locale file. Update the
string values for start-now-fail, start-now-task-fail, schedule-task-fail, and
reorder-task in the zh-CN task dictionary, keeping the existing placeholders
like {{taskName}} intact.
| "start-now-fail": "Failed to start scheduled task", | ||
| "start-now-task-fail": 'Failed to start task "{{taskName}}"', |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
Untranslated placeholder strings.
start-now-fail, start-now-task-fail, and reorder-task (and schedule-task-fail at line 9) remain in English rather than Traditional Chinese, unlike the rest of the newly added scheduling strings in this file which are translated.
Also applies to: 171-171
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/shared/locales/zh-TW/task.ts` around lines 159 - 160, The zh-TW task
locale still has untranslated scheduling keys mixed in with translated content.
Update the string values for schedule-task-fail, start-now-fail,
start-now-task-fail, and reorder-task in the task locale object so they are in
Traditional Chinese, matching the surrounding entries. Use the existing locale
keys in task.ts to locate and replace the English placeholders without changing
the key names or interpolation tokens like "{{taskName}}".
There was a problem hiding this comment.
38 issues found across 40 files (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="src/shared/locales/tr/task.ts">
<violation number="1" location="src/shared/locales/tr/task.ts:71">
P2: Turkish users will see English text for the new scheduled-start and reorder strings. Translate these three values to Turkish to match the rest of the locale file.</violation>
</file>
<file name="src/shared/locales/ru/task.ts">
<violation number="1" location="src/shared/locales/ru/task.ts:72">
P2: New locale keys for scheduled start ('start-now-fail', 'start-now-task-fail') and drag reorder ('reorder-task') are in English instead of Russian. Russian UI users will see untranslated text for these features. Translate the values to match the rest of the file.</violation>
</file>
<file name="src/shared/locales/ar/task.ts">
<violation number="1" location="src/shared/locales/ar/task.ts:70">
P2: These three new translation keys have English values in the Arabic locale file. Arabic-speaking users will see untranslated English text for these messages.</violation>
</file>
<file name="src/shared/locales/hu/task.ts">
<violation number="1" location="src/shared/locales/hu/task.ts:70">
P3: These three new locale strings are in English but should be in Hungarian to match the rest of the hu locale file. Consider translating: "start-now-fail" (e.g., "A feladat indítása sikertelen"), "start-now-task-fail" (e.g., 'A(z) "{{taskName}}" feladat indítása sikertelen'), and "reorder-task" (e.g., "Feladat átrendezése. Mozgatás a Fel/Le billentyűkkel").</violation>
</file>
<file name="src/shared/locales/pt-BR/task.ts">
<violation number="1" location="src/shared/locales/pt-BR/task.ts:72">
P3: These three new pt-BR locale keys have English values instead of Portuguese translations. All other keys in this file are properly translated.</violation>
<violation number="2" location="src/shared/locales/pt-BR/task.ts:88">
P3: These three new pt-BR locale keys have English values instead of Portuguese translations.</violation>
</file>
<file name="src/shared/locales/ro/task.ts">
<violation number="1" location="src/shared/locales/ro/task.ts:71">
P1: The new locale strings "start-now-fail", "start-now-task-fail", and "reorder-task" use English text instead of Romanian translations. This breaks the locale contract and will display English text to Romanian users.</violation>
<violation number="2" location="src/shared/locales/ro/task.ts:87">
P2: Same issue — "reorder-task" uses English text instead of Romanian.</violation>
</file>
<file name="src/shared/locales/fr/task.ts">
<violation number="1" location="src/shared/locales/fr/task.ts:71">
P3: Localization gap: this is the French locale file but the translation is left as English. Add a French translation, e.g. "Échec du démarrage de la tâche planifiée".</violation>
<violation number="2" location="src/shared/locales/fr/task.ts:86">
P3: Localization gap: this French locale entry is still in English. Add a French translation, e.g. "Réorganiser la tâche. Appuyez sur Haut ou Bas pour déplacer".</violation>
</file>
<file name="src/shared/locales/zh-CN/task.ts">
<violation number="1" location="src/shared/locales/zh-CN/task.ts:9">
P2: New localization value is in English in the zh-CN locale file. Users will see English text instead of Chinese.</violation>
<violation number="2" location="src/shared/locales/zh-CN/task.ts:159">
P2: New localization values are in English in the zh-CN locale file. Users will see English text instead of Chinese.</violation>
<violation number="3" location="src/shared/locales/zh-CN/task.ts:171">
P2: New localization value is in English in the zh-CN locale file. Users will see English text instead of Chinese.</violation>
</file>
<file name="src/renderer/store/task.ts">
<violation number="1" location="src/renderer/store/task.ts:850">
P2: Drag reorder failures can now surface as unhandled promise rejections in UI event handlers. This comes from rethrowing in `reorderTasks` after local rollback/fetch, while current callers do not catch the rejection; keeping the error handled locally (or adding caller catches) avoids noisy runtime errors.</violation>
</file>
<file name="src/shared/locales/ca/task.ts">
<violation number="1" location="src/shared/locales/ca/task.ts:73">
P2: These three new localization values are in English but the file is the Catalan locale (ca). All surrounding entries are translated to Catalan. Translate these to match the locale.</violation>
<violation number="2" location="src/shared/locales/ca/task.ts:90">
P3: Same issue - English string in Catalan locale.</violation>
</file>
<file name="src/shared/locales/vi/task.ts">
<violation number="1" location="src/shared/locales/vi/task.ts:70">
P3: New locale keys are in English rather than Vietnamese. The surrounding error messages (pause-task-fail, resume-task-fail, move-task-up, move-task-down) all have proper Vietnamese translations. Consider translating these to match the rest of the file so users see consistent Vietnamese text.</violation>
</file>
<file name="src/shared/locales/el/task.ts">
<violation number="1" location="src/shared/locales/el/task.ts:72">
P2: These three new translation keys have English values instead of Greek translations. The rest of the file is fully translated — users will see English text for scheduled-task failures and reorder instructions. Please replace with Greek translations to match the rest of the locale.</violation>
</file>
<file name="src/shared/locales/es/task.ts">
<violation number="1" location="src/shared/locales/es/task.ts:72">
P2: Spanish locale entry is in English instead of Spanish. Translate to follow existing error message patterns (e.g., 'Hubo un fallo al' for fail messages, 'programada' for scheduled).</violation>
<violation number="2" location="src/shared/locales/es/task.ts:88">
P2: Spanish locale entry is in English instead of Spanish. Translate to follow existing key conventions.</violation>
</file>
<file name="src/shared/locales/ja/task.ts">
<violation number="1" location="src/shared/locales/ja/task.ts:72">
P3: The three newly added string keys "start-now-fail", "start-now-task-fail", and "reorder-task" use English values in the Japanese locale file. Japanese users will see English text for these messages. Add Japanese translations for each.</violation>
</file>
<file name="src/shared/locales/bg/task.ts">
<violation number="1" location="src/shared/locales/bg/task.ts:71">
P2: Missing Bulgarian translation for `"start-now-fail"`. The value is in English, but this is the Bulgarian locale file. Follow the pattern from similar error keys like `"pause-task-fail"` (грешка при спиране) and `"resume-task-fail"` (грешка при възобновяване) for consistency.</violation>
<violation number="2" location="src/shared/locales/bg/task.ts:72">
P2: Missing Bulgarian translation for `"start-now-task-fail"`. Follow the established Bulgarian pattern from `"pause-task-fail"` (грешка при спиране на задачата) and `"resume-task-fail"` (грешка при възобновяване на задачата).</violation>
<violation number="3" location="src/shared/locales/bg/task.ts:87">
P2: Missing Bulgarian translation for `"reorder-task"`. Nearby accessibility keys like `"move-task-up"` (Преместване на задача нагоре) and `"move-task-down"` (Преместване на задача надолу) show the expected locale pattern.</violation>
</file>
<file name="src/shared/locales/ko/task.ts">
<violation number="1" location="src/shared/locales/ko/task.ts:70">
P2: Korean locale entries for start-now-fail, start-now-task-fail, and reorder-task contain English text. The surrounding keys are translated to Korean — these should be translated for consistency so Korean users see localized error and accessibility messages.</violation>
</file>
<file name="src/shared/locales/nb/task.ts">
<violation number="1" location="src/shared/locales/nb/task.ts:70">
P2: These three new locale entries are in English instead of Norwegian Bokmål. They will display as English prompts in the Norwegian UI. Translate them for consistency with the rest of the file.</violation>
<violation number="2" location="src/shared/locales/nb/task.ts:86">
P2: Same untranslated issue — "Reorder task. Press Up or Down to move" shows English text in the Norwegian locale. Translate to Norwegian.</violation>
</file>
<file name="src/renderer/components/Task/TaskItem.vue">
<violation number="1" location="src/renderer/components/Task/TaskItem.vue:17">
P2: When the drag handle has focus, all key presses are swallowed, so list-level shortcuts stop working from that state. Using `.stop` only for handled keys (or removing it here) preserves global shortcuts while keeping ArrowUp/ArrowDown reorder behavior.</violation>
</file>
<file name="src/renderer/components/ui/date-time-picker/DateTimePicker.vue">
<violation number="1" location="src/renderer/components/ui/date-time-picker/DateTimePicker.vue:26">
P2: The new future clamp can still allow near-immediate scheduling because rounding seconds to `00` moves the minimum backward within the minute. Computing the minimum as a minute-ceil timestamp after adding 60s would keep the guard consistently at least one minute ahead.</violation>
</file>
<file name="src/shared/locales/zh-TW/task.ts">
<violation number="1" location="src/shared/locales/zh-TW/task.ts:9">
P3: Add Traditional Chinese translation for the new `schedule-task-fail` locale key. Users will see English text instead of Chinese in the UI.</violation>
<violation number="2" location="src/shared/locales/zh-TW/task.ts:159">
P3: Add Traditional Chinese translation for `start-now-fail`. The English fallback will be shown to zh-TW users.</violation>
<violation number="3" location="src/shared/locales/zh-TW/task.ts:160">
P3: Add Traditional Chinese translation for `start-now-task-fail`. This error message will appear in Chinese UI context but remains in English.</violation>
<violation number="4" location="src/shared/locales/zh-TW/task.ts:171">
P3: Add Traditional Chinese translation for the `reorder-task` accessibility hint. This is shown as an aria label for drag-reorder interactions.</violation>
</file>
<file name="src/renderer/components/Task/MissedScheduleDialog.vue">
<violation number="1" location="src/renderer/components/Task/MissedScheduleDialog.vue:120">
P2: Bulk start now fires every `startNow` in parallel, which multiplies `fetchList`/`saveSession` side effects and can cause avoidable request bursts and state thrash for larger missed lists. Keeping failure tracking but processing sequentially avoids the concurrency spike while preserving the new partial-failure behavior.</violation>
</file>
<file name="src/renderer/components/Task/TaskList.vue">
<violation number="1" location="src/renderer/components/Task/TaskList.vue:336">
P2: When a user tabs to a non-selected task's drag handle and presses ArrowUp/Down while other tasks are selected, `moveSelection` moves the unrelated selected tasks instead of the focused task. The `fallbackKey` path only activates when no items are selected (`moving.length === 0`), so a non-selected focused task is ignored when the selection has other items. Consider checking whether the fallback task is in the selection before falling back to the full selection, so that the keyboard interaction targets the task the user is actually focused on.</violation>
<violation number="2" location="src/renderer/components/Task/TaskList.vue:343">
P2: `moveSelection` calls `reorderTasks` without `await` or `.catch()`, producing an unhandled promise rejection on failure. The store's `reorderTasks` now re-throws errors after rollback (`throw err`), so any backend save failure triggers an unhandled rejection even though the local state was already restored via `fetchList`. Add `.catch(() => {})` to suppress the rejection (the rollback already ran) or `await` the call if the caller should handle it.</violation>
</file>
<file name="src/shared/locales/en-US/task.ts">
<violation number="1" location="src/shared/locales/en-US/task.ts:9">
P3: `schedule-task-fail` is added to only en-US, zh-CN, and zh-TW, while the other three new keys (`start-now-fail`, `start-now-task-fail`, `reorder-task`) are added to all 26 locale files. Since i18next's `fallbackLng: "en-US"` covers the missing locales at runtime, this won't cause a visible issue. Still, for consistency with how the rest of this PR handles new keys, consider adding `schedule-task-fail` with English placeholder text to the remaining 23 locale files as well.</violation>
<violation number="2" location="src/shared/locales/en-US/task.ts:9">
P3: This Simplified Chinese locale adds new scheduling/reorder strings in English, which creates inconsistent mixed-language UI in those states. Localizing the newly added keys would align this file with the rest of the translated entries.</violation>
</file>
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
| "pause-task-fail": 'Nu s-a putut întrerupe sarcina "{{taskName}}"', | ||
| "resume-task": "Reluați sarcina", | ||
| "resume-task-success": 'Sarcina "{{taskName}}" a fost reluata cu succes', | ||
| "start-now-fail": "Failed to start scheduled task", |
There was a problem hiding this comment.
P1: The new locale strings "start-now-fail", "start-now-task-fail", and "reorder-task" use English text instead of Romanian translations. This breaks the locale contract and will display English text to Romanian users.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/ro/task.ts, line 71:
<comment>The new locale strings "start-now-fail", "start-now-task-fail", and "reorder-task" use English text instead of Romanian translations. This breaks the locale contract and will display English text to Romanian users.</comment>
<file context>
@@ -68,6 +68,8 @@ export default {
"pause-task-fail": 'Nu s-a putut întrerupe sarcina "{{taskName}}"',
"resume-task": "Reluați sarcina",
"resume-task-success": 'Sarcina "{{taskName}}" a fost reluata cu succes',
+ "start-now-fail": "Failed to start scheduled task",
+ "start-now-task-fail": 'Failed to start task "{{taskName}}"',
"resume-task-fail": 'Nu s-a putut relua sarcina "{{taskName}}"',
</file context>
| "pause-task-fail": '"{{taskName}}" görevi durdurulamadı', | ||
| "resume-task": "Görevi sürdür", | ||
| "resume-task-success": '"{{taskName}}" devam ettirildi', | ||
| "start-now-fail": "Failed to start scheduled task", |
There was a problem hiding this comment.
P2: Turkish users will see English text for the new scheduled-start and reorder strings. Translate these three values to Turkish to match the rest of the locale file.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/tr/task.ts, line 71:
<comment>Turkish users will see English text for the new scheduled-start and reorder strings. Translate these three values to Turkish to match the rest of the locale file.</comment>
<file context>
@@ -68,6 +68,8 @@ export default {
"pause-task-fail": '"{{taskName}}" görevi durdurulamadı',
"resume-task": "Görevi sürdür",
"resume-task-success": '"{{taskName}}" devam ettirildi',
+ "start-now-fail": "Failed to start scheduled task",
+ "start-now-task-fail": 'Failed to start task "{{taskName}}"',
"resume-task-fail": '"{{taskName}}" devam ettirilemedi',
</file context>
| "pause-task-fail": 'Ошибка во время остановки задания "{{taskName}}"', | ||
| "resume-task": "Возобновить задание", | ||
| "resume-task-success": 'Успешно возобновлено задание "{{taskName}}"', | ||
| "start-now-fail": "Failed to start scheduled task", |
There was a problem hiding this comment.
P2: New locale keys for scheduled start ('start-now-fail', 'start-now-task-fail') and drag reorder ('reorder-task') are in English instead of Russian. Russian UI users will see untranslated text for these features. Translate the values to match the rest of the file.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/ru/task.ts, line 72:
<comment>New locale keys for scheduled start ('start-now-fail', 'start-now-task-fail') and drag reorder ('reorder-task') are in English instead of Russian. Russian UI users will see untranslated text for these features. Translate the values to match the rest of the file.</comment>
<file context>
@@ -69,6 +69,8 @@ export default {
"pause-task-fail": 'Ошибка во время остановки задания "{{taskName}}"',
"resume-task": "Возобновить задание",
"resume-task-success": 'Успешно возобновлено задание "{{taskName}}"',
+ "start-now-fail": "Failed to start scheduled task",
+ "start-now-task-fail": 'Failed to start task "{{taskName}}"',
"resume-task-fail": 'Ошибка во время возобновления задания "{{taskName}}"',
</file context>
| "pause-task-fail": ' فشل في ايقاف التحميل "{{taskName}}"', | ||
| "resume-task": "إستئناف التحميل", | ||
| "resume-task-success": 'تم بنجاح إستئناف التحميل "{{taskName}}"', | ||
| "start-now-fail": "Failed to start scheduled task", |
There was a problem hiding this comment.
P2: These three new translation keys have English values in the Arabic locale file. Arabic-speaking users will see untranslated English text for these messages.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/ar/task.ts, line 70:
<comment>These three new translation keys have English values in the Arabic locale file. Arabic-speaking users will see untranslated English text for these messages.</comment>
<file context>
@@ -67,6 +67,8 @@ export default {
"pause-task-fail": ' فشل في ايقاف التحميل "{{taskName}}"',
"resume-task": "إستئناف التحميل",
"resume-task-success": 'تم بنجاح إستئناف التحميل "{{taskName}}"',
+ "start-now-fail": "Failed to start scheduled task",
+ "start-now-task-fail": 'Failed to start task "{{taskName}}"',
"resume-task-fail": 'فشل في إستئناف التحميل "{{taskName}}"',
</file context>
| "Nu s-au putut șterge fișierele sarcinii, ștergeți-le manual", | ||
| "remove-task-config-file-fail": | ||
| "Ștergerea fișierului de configurare a sarcinii nu a reușit, ștergeți-l manual", | ||
| "reorder-task": "Reorder task. Press Up or Down to move", |
There was a problem hiding this comment.
P2: Same issue — "reorder-task" uses English text instead of Romanian.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/ro/task.ts, line 87:
<comment>Same issue — "reorder-task" uses English text instead of Romanian.</comment>
<file context>
@@ -82,6 +84,7 @@ export default {
"Nu s-au putut șterge fișierele sarcinii, ștergeți-le manual",
"remove-task-config-file-fail":
"Ștergerea fișierului de configurare a sarcinii nu a reușit, ștergeți-l manual",
+ "reorder-task": "Reorder task. Press Up or Down to move",
"move-task-up": "Muta sarcina în sus",
"move-task-down": "Muta sarcina în jos",
</file context>
| "open-task": "開啟檔案", | ||
| "resume-task-success": '繼續任務 "{{taskName}}" 成功', | ||
| "start-now-fail": "Failed to start scheduled task", | ||
| "start-now-task-fail": 'Failed to start task "{{taskName}}"', |
There was a problem hiding this comment.
P3: Add Traditional Chinese translation for start-now-task-fail. This error message will appear in Chinese UI context but remains in English.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/zh-TW/task.ts, line 160:
<comment>Add Traditional Chinese translation for `start-now-task-fail`. This error message will appear in Chinese UI context but remains in English.</comment>
<file context>
@@ -155,6 +156,8 @@ export default {
"open-task": "開啟檔案",
"resume-task-success": '繼續任務 "{{taskName}}" 成功',
+ "start-now-fail": "Failed to start scheduled task",
+ "start-now-task-fail": 'Failed to start task "{{taskName}}"',
"resume-task-fail": '繼續任務 "{{taskName}}" 失敗',
"delete-task": "移除任務",
</file context>
| "stop-seeding": "停止做種", | ||
| "open-task": "開啟檔案", | ||
| "resume-task-success": '繼續任務 "{{taskName}}" 成功', | ||
| "start-now-fail": "Failed to start scheduled task", |
There was a problem hiding this comment.
P3: Add Traditional Chinese translation for start-now-fail. The English fallback will be shown to zh-TW users.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/zh-TW/task.ts, line 159:
<comment>Add Traditional Chinese translation for `start-now-fail`. The English fallback will be shown to zh-TW users.</comment>
<file context>
@@ -155,6 +156,8 @@ export default {
"stop-seeding": "停止做種",
"open-task": "開啟檔案",
"resume-task-success": '繼續任務 "{{taskName}}" 成功',
+ "start-now-fail": "Failed to start scheduled task",
+ "start-now-task-fail": 'Failed to start task "{{taskName}}"',
"resume-task-fail": '繼續任務 "{{taskName}}" 失敗',
</file context>
| stopped: "已停止", | ||
| completed: "已完成", | ||
| "start-now": "立即開始", | ||
| "schedule-task-fail": "Failed to schedule task", |
There was a problem hiding this comment.
P3: Add Traditional Chinese translation for the new schedule-task-fail locale key. Users will see English text instead of Chinese in the UI.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/zh-TW/task.ts, line 9:
<comment>Add Traditional Chinese translation for the new `schedule-task-fail` locale key. Users will see English text instead of Chinese in the UI.</comment>
<file context>
@@ -6,6 +6,7 @@ export default {
stopped: "已停止",
completed: "已完成",
"start-now": "立即開始",
+ "schedule-task-fail": "Failed to schedule task",
"schedule-task": "排程開始…",
"reschedule-task": "重新排程…",
</file context>
| stopped: "Stopped", | ||
| completed: "Completed", | ||
| "start-now": "Start Now", | ||
| "schedule-task-fail": "Failed to schedule task", |
There was a problem hiding this comment.
P3: schedule-task-fail is added to only en-US, zh-CN, and zh-TW, while the other three new keys (start-now-fail, start-now-task-fail, reorder-task) are added to all 26 locale files. Since i18next's fallbackLng: "en-US" covers the missing locales at runtime, this won't cause a visible issue. Still, for consistency with how the rest of this PR handles new keys, consider adding schedule-task-fail with English placeholder text to the remaining 23 locale files as well.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/en-US/task.ts, line 9:
<comment>`schedule-task-fail` is added to only en-US, zh-CN, and zh-TW, while the other three new keys (`start-now-fail`, `start-now-task-fail`, `reorder-task`) are added to all 26 locale files. Since i18next's `fallbackLng: "en-US"` covers the missing locales at runtime, this won't cause a visible issue. Still, for consistency with how the rest of this PR handles new keys, consider adding `schedule-task-fail` with English placeholder text to the remaining 23 locale files as well.</comment>
<file context>
@@ -6,6 +6,7 @@ export default {
stopped: "Stopped",
completed: "Completed",
"start-now": "Start Now",
+ "schedule-task-fail": "Failed to schedule task",
"schedule-task": "Schedule…",
"reschedule-task": "Reschedule…",
</file context>
| stopped: "Stopped", | ||
| completed: "Completed", | ||
| "start-now": "Start Now", | ||
| "schedule-task-fail": "Failed to schedule task", |
There was a problem hiding this comment.
P3: This Simplified Chinese locale adds new scheduling/reorder strings in English, which creates inconsistent mixed-language UI in those states. Localizing the newly added keys would align this file with the rest of the translated entries.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/shared/locales/en-US/task.ts, line 9:
<comment>This Simplified Chinese locale adds new scheduling/reorder strings in English, which creates inconsistent mixed-language UI in those states. Localizing the newly added keys would align this file with the rest of the translated entries.</comment>
<file context>
@@ -6,6 +6,7 @@ export default {
stopped: "Stopped",
completed: "Completed",
"start-now": "Start Now",
+ "schedule-task-fail": "Failed to schedule task",
"schedule-task": "Schedule…",
"reschedule-task": "Reschedule…",
</file context>
Summary by cubic
Adds scheduled starts, drag-and-drop reordering with a handle, and a strict priority queue that preempts lower-priority downloads to honor the max concurrent cap. The release workflow now preserves Tauri updater signatures, publishes
.sig, and builds a cross-platformlatest.jsonfor in-app updates.New Features
reorder_tasks.reorder_tasks,set_task_schedule,start_task_now,tell_scheduled;DateTimePickerinput; task model fieldsscheduled,startAt,scheduleMissed.Refactors
.sigand.sha256, and aggregate updater fragments to generatelatest.jsonusingscripts/build-updater-manifest.mjs(with tests).Written for commit b1b670c. Summary will update on new commits.